#include <iostream>
#include <string>
#include <vector>
#include <functional>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdlib.h>

using namespace std;

// typedef function<void ()> func;
// vector<func> callbacks;

// uint64_t count=0;

// void showCount()
// {
//     //cout << "进程捕捉到了一个信号，正在处理中: " << signum << "Pid: " << getpid() << endl;
//     cout << "final count: " << count << endl;
// }

// void showLog()
// {
//     cout << "这个是日志功能" << endl;
// }

// void logUser()
// {
//     if(fork()==0)
//     {
//         execl("/usr/bin/who", "who", nullptr);
//         exit(1);
//     }
//     wait(nullptr);
// }

// void flushdata()
// {

// }

// //定时器功能
// //sig:
// void catchSig(int signum)
// {
//     for(auto &f : callbacks)
//     {
//         f();
//     }
//     alarm(1);
// }

// static void Usage(string proc)
// {
//     cout << "Usage:\r\n\t" << proc << " signumber processid" << endl;
// }

void handler(int signum)
{
    sleep(1);
    cout << "获得了一个信号: " << signum << endl;
    // exit(1);
}

// ./mykill 2 pid
int main(int argc, char* argv[])
{
    // signal(SIGFPE, handler);
    // int a=100;
    // a/=0;

    signal(SIGSEGV, handler);

    int* p;
    *p=100;

    while(true) sleep(1);


    // //验证1s之内一共会进行多少次count++
    // signal(SIGALRM, catchSig);
    // alarm(1);

    // callbacks.push_back(showCount);
    // callbacks.push_back(showLog);
    // callbacks.push_back(logUser);
    // while(true) count++;


    //cout << "我开始运行了..." << endl;
    //abort(); //通常用来终止进程

    // sleep(1);
    // raise(8);


    // if(argc != 3)
    // {
    //     Usage(argv[0]);
    //     exit(1);
    // }

    // int signumber=atoi(argv[1]);
    // int procid=atoi(argv[2]);
    
    // kill(procid, signumber);


    //signal(2, catchSig);
    //键盘
    // signal(SIGINT, catchSig); //特定信号的处理动作一般只有一个
    // //Ctrl+\;
    // signal(SIGQUIT, catchSig);
    //signal函数仅仅只是修改进程对特定信号的后续处理动作，不是直接调用对应的处理动作
    //如果后续没有任何SIGINT信号产生，catchSig会不会被调用？—— 永远也不会被调用

    // while(true)
    // {
    //     cout << "我是一个进程，我正在运行..., Pid: " << getpid() << endl;
    //     sleep(1);

    //     int a=100;
    //     a/=0;

    //     cout << "run here..." << endl;
    // }

    // pid_t id=fork();
    // if(id==0)
    // {
    //     sleep(1);
    //     int a=100;
    //     a/=0;
    //     exit(0);
    // }

    // int status=0;
    // waitpid(id, &status, 0);
    // cout << "父进程: " << getpid() << " 子进程: " << id << \
    //  " exit sig: " << (status & 0x7F) << " is core: " << ((status >> 7) & 1) << endl;
    return 0;
}